package org.Shiikong_Memory.SakuraBlockFrame.DataTool;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import com.google.gson.Gson;
import org.Shiikong_Memory.SakuraBlockFrame.PluginCommunication.MessagePayload;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * RedisTool 类提供了与 Redis 数据库进行交互的功能，实现了 AutoCloseable 接口，
 * 可在 try-with-resources 语句中使用，确保资源的正确关闭。
 * @author Shiikong_Memory
 * @version 1.0
 */
public class RedisTool implements AutoCloseable {
    /**
     * Jedis 连接池，用于管理 Jedis 连接，提高性能和效率。
     */
    private final JedisPool jedisPool;

    /**
     * 构造函数，初始化 Redis 连接池。
     *
     * @param host Redis 服务器的主机名。
     * @param port Redis 服务器的端口号。
     * @param password 连接 Redis 服务器所需的密码，若无需密码可传 null 或空字符串。
     * @param database 要使用的 Redis 数据库编号。
     */
    public RedisTool(String host, int port, String password, int database) {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(100); // 最大连接数
        poolConfig.setMaxIdle(10);   // 最大空闲连接数
        poolConfig.setMinIdle(1);    // 最小空闲连接数
        poolConfig.setTestOnBorrow(true); // 借用连接时进行测试

        if (password != null && !password.isEmpty()) {
            this.jedisPool = new JedisPool(poolConfig, host, port, 2000, password, database);
        } else {
            this.jedisPool = new JedisPool(poolConfig, host, port, 2000, null, database);
        }
    }

    /**
     * 向 Redis 中添加键值对。
     *
     * @param key 要添加的键。
     * @param value 要添加的值。
     * @return Redis 执行 SET 命令的返回结果。
     */
    public String set(String key, String value) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.set(key, value);
        }
    }

    /**
     * 根据键从 Redis 中查询对应的值。
     *
     * @param key 要查询的键。
     * @return 键对应的值，若键不存在则返回 null。
     */
    public String get(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.get(key);
        }
    }

    /**
     * 从 Redis 中删除指定的键值对。
     * 注意：该方法从未被使用，若不需要可考虑移除。
     *
     * @param keys 要删除的键的可变参数列表。
     * @return 成功删除的键的数量。
     */
    public Long del(String... keys) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.del(keys);
        }
    }

    /**
     * 修改 Redis 中指定键的值。
     * 注意：该方法从未被使用，若不需要可考虑移除。
     * 本质上是调用 set 方法重新设置键的值。
     *
     * @param key 要修改的键。
     * @param newValue 新的值。
     * @return Redis 执行 SET 命令的返回结果。
     */
    public String update(String key, String newValue) {
        return set(key, newValue); // 修改操作本质上就是重新设置值
    }

    /**
     * 关闭 Jedis 连接池，释放资源。
     */
    public void close() {
        if (jedisPool != null && !jedisPool.isClosed()) {
            jedisPool.close();
        }
    }

    /**
     * 获取 Jedis 连接池实例。
     *
     * @return Jedis 连接池对象。
     */
    public JedisPool getJedisPool() {
        return jedisPool;
    }
}